package com.itany.shop.service.impl;

import com.itany.shop.dao.ProductDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Product;
import com.itany.shop.exception.DataAccessException;
import com.itany.shop.exception.RequestParameterErrorException;
import com.itany.shop.exception.ServiceException;
import com.itany.shop.exception.UserNotLoginException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.CartService;
import com.itany.shop.util.ParameterUtil;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/4/18 10:35
 * Version:1.0-SNAPSHOT
 * Description:
 */
public class CartServiceImpl implements CartService {

    private ProductDao productDao = (ProductDao) ObjectFactory.getObject("productDao");

    @Override
    public void addCart(Cart cart, String productId) throws UserNotLoginException, RequestParameterErrorException, ServiceException {
        if(null == cart){
            throw new UserNotLoginException("请先登录");
        }
        if(ParameterUtil.isNull(productId)){
            throw new RequestParameterErrorException("请求参数有误");
        }

        try {
            // 查询当前商品的最新信息
            Product product = productDao.selectById(Integer.parseInt(productId));

            // 加入购物车有两种情况
            // 1.当前购物车中已经存在该商品
            // 2.当前购物车中尚未存在该商品
            // 通过遍历当前购物车的明细情况,来判断是否存在对应商品
            // 取出当前购物车的明细信息
            List<Item> items = cart.getItems();
            for(Item item : items){
                // 如果明细中商品的主键与当前商品的主键值一致,则表示存在
                if(item.getProduct().getId().equals(product.getId())){
                    // 此时购物车发生如下变化
                    // 1.明细数量=原来的明细数量+1
                    item.setNum(item.getNum()+1);
                    // 当明细总价发生变化之前属于原来的明细总价
                    // 获取原来的明细总价
                    Double oldPrice = item.getPrice();
                    // 2.明细总价=当前明细数量*当前商品单价
                    item.setPrice(item.getNum()*product.getPrice());
                    // 当明细总价发生变化之后属于现在的明细总价
                    // 获取现在的明细总价
                    Double newPrice = item.getPrice();
                    // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                    cart.setPrice(cart.getPrice()-oldPrice+newPrice);
                    return;
                }
            }
            // 如果明细中不存在新增的商品
            // 则此时购物车发生如下变化
            // 1.新增一条明细信息
            Item item = new Item();
            // 此时明细数量=1
            item.setNum(1);
            // 此时明细总价=商品单价
            item.setPrice(product.getPrice());
            // 将当前商品交给明细
            item.setProduct(product);
            // 将新增的明细加入到购物车对象中
            cart.addItem(item);
            // 2.购物车总价=原来的购物车总价+当前商品的单价
            cart.setPrice(cart.getPrice()+product.getPrice());
        } catch (DataAccessException e) {
            e.printStackTrace();
            throw new ServiceException(e.getMessage());
        }
    }

    @Override
    public void modifyCart(Cart cart, String productId, String num) throws UserNotLoginException, RequestParameterErrorException, ServiceException {
        if(null == cart){
            throw new UserNotLoginException("请先登录");
        }
        if(ParameterUtil.isNull(productId) || ParameterUtil.isNull(num)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        try {
            // 查询当前商品的最新信息
            Product product = productDao.selectById(Integer.parseInt(productId));
            List<Item> items = cart.getItems();
            for(Item item : items){
                if(item.getProduct().getId().equals(product.getId())){
                    // 找到需要修改的明细
                    // 购物车发生如下变化
                    // 1.明细的数量=num
                    item.setNum(Integer.parseInt(num));
                    // 获取原来的明细总价
                    Double oldPrice = item.getPrice();
                    // 2.明细的总价=当前明细的数量*当前商品的单价
                    item.setPrice(item.getNum()*product.getPrice());
                    // 获取现在的明细总价
                    Double newPrice = item.getPrice();
                    // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                    cart.setPrice(cart.getPrice()-oldPrice+newPrice);
                }
            }
        } catch (DataAccessException e) {
            e.printStackTrace();
            throw new ServiceException(e.getMessage());
        }
    }

    @Override
    public void removeCart(Cart cart, String productId) throws UserNotLoginException, RequestParameterErrorException {
        if(null == cart){
            throw new UserNotLoginException("请先登录");
        }
        if(ParameterUtil.isNull(productId)){
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 由于此时需要删除明细集合中指定的明细
        // 因此,不能通过foreach进行迭代
        List<Item> items = cart.getItems();
        for(int i = 0; i < items.size(); i++){
            Item item = items.get(i);
            // 找到需要删除的明细
            if(item.getProduct().getId().equals(Integer.parseInt(productId))){
                // 此时购物车发生如下变化
                // 1.购物车总价=原来的购物车总价-明细总价
                cart.setPrice(cart.getPrice()-item.getPrice());
                // 2.移除对应的明细信息
                cart.removeItem(item);
            }
        }
    }
}
